package org.epanetgrid.otimizacao.objfunctions;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.epanetgrid.model.nodes.ITank;
import org.epanetgrid.otimizacao.util.ExceptionUtils;
import org.epanetgrid.resultado.ResultadoSimulacao;
import org.epanetgrid.resultado.output.AlturaNode;


/**
 * @author alan
 *
 */
public class VariacaoDeNiveisObjectiveFunction implements ObjectiveFunction<ResultadoSimulacao, Double> {

	private static final long serialVersionUID = -567762917978460508L;

	/* (non-Javadoc)
	 * @see epanetgridag.otimizacao.objfunctions.ObjectiveFunction#evaluate(java.lang.Object)
	 */
	public Double evaluate(ResultadoSimulacao result) {
		ExceptionUtils.checkNull(result, "O resultado para a função objetivo não pode ser nulo.");
		
		Set<ITank<?>> tanks = result.getNetwork().getTanks();
		
		double total = 0.0;
		List<Map<String, AlturaNode>> alturaNodes = result.getRelatorioFinal().alturaNodes();
		
		for (ITank<?> tank : tanks) {
			double variacao = (alturaNodes.get(alturaNodes.size()-1).get(tank.label()).getAltura().getEstimatedValue()
					- alturaNodes.get(0).get(tank.label()).getAltura().getEstimatedValue());
			if (variacao < 0) {
				variacao *= -1;
			} else {
				variacao = 0;
			}
			total += variacao;
		}
		
		return total;
	}

}
